/******************************************************************************

		dkyowin.cpp \212\117\214\360\201\105\213\244\223\257\203\105\203\102\203\223\203\150\203\105

										1998.4.16	KEN.KURATANI

******************************************************************************/

#include "stdafx.h"
#include "maincmd.h"
#include "san6view.h"
#include "gaikou.h"
#include "dgaiwin.h"
#include "dkyowin.h"
#include "comsub.h"
#include "msg.h"

IMPLEMENT_DYNAMIC(GaikouKyoudouWindow, GaikouWindow);

#undef	CURRENTCLASS
#define	CURRENTCLASS	GaikouKyoudouWindow

BEGIN_MESSAGE_MAP(GaikouKyoudouWindow, GaikouWindow)
	//{{AFX_MSG_MAP(GaikouKyoudouWindow)
	ON_COMMAND(ID_KYOUDOU_OK, OnOk)
	ON_COMMAND(ID_KYOUDOU_CANCEL, OnCancel)
	ON_COMMAND(ID_KYOUDOU_TOSHI, OnToshi)
	ON_COMMAND(ID_KYOUDOU_KUNSHU, OnKunshu)
	ON_COMMAND(ID_KYOUDOU_BUSHOU, OnBushou)
	ON_COMMAND(ID_KYOUDOU_JOUKEN, OnJouken)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

#if	defined(_PC)
GaikouKyoudouWindow::GaikouKyoudouWindow()
{
}

GaikouKyoudouWindow::~GaikouKyoudouWindow()
{
}
#endif

const	INT	KYOUDOU_WIN_WX	= 144 + 8;
const	INT	KYOUDOU_WIN_WY	= 168 + 8;
const	INT	KYOUDOU_WIN_SX	= 12 - 4;
const	INT	KYOUDOU_WIN_SY	= 12 - 4;
const	INT	KYOUDOU_WIN_DX	= KYOUDOU_WIN_SX + KYOUDOU_WIN_WX;
const	INT	KYOUDOU_WIN_DY	= KYOUDOU_WIN_SY + KYOUDOU_WIN_WY;

char*	GaikouKyoudouWindow::m_strBtn[KYOUDOU_BTN_MAX] = {
	"\223\163\216\163", "\214\121\227\131", "\225\220\217\253", "\217\360\214\217", "\214\210\222\350", "\222\206\216\176"
};

POINT	GaikouKyoudouWindow::m_poBtn[KYOUDOU_BTN_MAX] = {
	{4 + 4, 36 + 4},
	{4 + 4, 60 + 4},
	{4 + 4, 84 + 4},
	{4 + 4, 108 + 4},
	{20 + 4, 140 + 4},
	{84 + 4, 140 + 4},
};

CtrlLayout		GaikouKyoudouWindow::ctrlLayout[KYOUDOU_LAYOUT_MAX];
DialogLayout	GaikouKyoudouWindow::Layout = {
	WINID_GAIKOUWIN, "GaikouKyoudouWindow", {KYOUDOU_WIN_SX, KYOUDOU_WIN_SY, KYOUDOU_WIN_DX, KYOUDOU_WIN_DY},
	WS_POPUP|WS_BORDER, MAINTRANSMODE, DEFAULT_BACK, KYOUDOU_LAYOUT_MAX, ctrlLayout
};

/* \203\214\203\103\203\101\203\105\203\147 */
VOID	GaikouKyoudouWindow::InitialCtrlLayout(VOID)
{
	INT	i;
/* \203\173\203\136\203\223 */
	INT	num = 0;
	INT	IDnum = ID_GAIKOU_BTN_START;
	INT	IMnum = 0;
	for ( i = 0 ; i < KYOUDOU_BTN_MAX ; i++ ) {
#if	defined( _PC )
		CPoint	po = m_poBtn[i];
#else	// defined( _PC )
		POINT	po = m_poBtn[i];
#endif	// defined( _PC )
		MakeSysButtonState1(&ctrlLayout[num++], IDnum++,
					GNO_TMP_TEXT(IMnum), m_strBtn[i], po.x, po.y);
		IMnum++;
	}
/* \202\163\202\144\202\167\202\163 */
	IDnum = ID_GAIKOU_TEXT_START;
	/* \203\136\203\103\203\147\203\213 */
	MakeTextState(&ctrlLayout[num++], IDnum++,
					GNO_TMP_TEXT(IMnum), "\213\244\223\257", 4 + 4, 4 + 4);
	IMnum++;
	/* \225\113\227\166\213\103\227\315 */
	MakeTextState(&ctrlLayout[num++], IDnum++,
					GNO_TMP_TEXT(IMnum), "\213\103\227\31540", 92 + 4, 8 + 4);
	IMnum++;
	/* \223\163\216\163 */
	if ( ACTIVE(m_pktTgt) ) {
		MakeTextState(&ctrlLayout[num++], IDnum++,
					GNO_TMP_TEXT(IMnum), (char*)m_pktTgt->strName(), 44 + 4, 40 + 4);
	}
	else {
		MakeTextState(&ctrlLayout[num++], IDnum++,
					GNO_TMP_TEXT(IMnum), (char*)strNameNull4, 44 + 4, 40 + 4);
	}
	IMnum++;
	/* \214\121\227\131 */
	if ( ACTIVE(m_pkkTgt) ) {
		MakeTextState(&ctrlLayout[num++], IDnum++,
					GNO_TMP_TEXT(IMnum), (char*)m_pkkTgt->strName(), 44 + 4, 64 + 4);
	}
	else {
		MakeTextState(&ctrlLayout[num++], IDnum++,
					GNO_TMP_TEXT(IMnum), (char*)strNameNull4, 44 + 4, 64 + 4);
	}
	IMnum++;
	/* \225\220\217\253 */
	if ( ACTIVE(m_pkb) ) {
		MakeTextState(&ctrlLayout[num++], IDnum++,
					GNO_TMP_TEXT(IMnum), (char*)m_pkb->strName(), 44 + 4, 88 + 4);
	}
	else {
		MakeTextState(&ctrlLayout[num++], IDnum++,
					GNO_TMP_TEXT(IMnum), (char*)strNameNull4, 44 + 4, 88 + 4);
	}
	IMnum++;
	/* \217\360\214\217 */
	GaikouWindow::DspJouken();
	MakeTextState(&ctrlLayout[num++], IDnum++,
					GNO_JOUKEN_TEXT(0), m_strJouken, 44 + 4, 112 + 4);
	IMnum++;
	ASSERT(KYOUDOU_LAYOUT_MAX == num);
	ASSERT(KYOUDOU_LAYOUT_MAX == IMnum);
}

static
INT	_sort_func_kyoudou(BPtr pkb)
{
	INT	kazu = pkb->iMiryoku() + (pkb->iSeiji() * 2);
	if ( pkb->isKoushou() ) {
		kazu *= 2;
	}
	return kazu;
}

BOOL GaikouKyoudouWindow::InitData(TPtr pkt, MainCommand* pMainCmd, CWnd* pParentWnd)
{
	CGameDoc* pDoc = ::GetSan6App().GetDocument();
	ASSERT(pDoc != NULL);
	m_pParentWnd = pParentWnd;
	m_pDlgLayout = &Layout;
	m_iOkBtnID = ID_KYOUDOU_OK;
	if ( NOTACTIVE(pkt) ) {
		return FALSE;
	}
	m_pMainCommand = pMainCmd;
	m_pkt = pkt;
	m_pkk = pkt->pkkShozoku();
	if ( NOTACTIVE(m_pkk) ) {
		return FALSE;
	}
	m_GaikouType = GAIKOU_KYOUDOU;		/* \213\244\223\257 */
	m_BtnMax = KYOUDOU_BTN_MAX;			/* \203\173\203\136\203\223\202\154\202\140\202\167 */
	m_TextMax = KYOUDOU_TEXT_MAX;		/* \202\163\202\144\202\167\202\163 \202\154\202\140\202\167 */
	GaikouWindow::InitData();
	if ( 0 == m_pMainCommand->PickKyoudouBushou(m_pkk, &m_BList) ) {
		return FALSE;
	}
	if ( 0 == m_pMainCommand->PickKyoudouKunshu(m_pkk, &m_KList) ) {
		return FALSE;
	}
	if ( 0 == m_pMainCommand->PickKyoudouToshi(m_pkk, &m_TList) ) {
		return FALSE;
	}
	m_BList.Sort(_sort_func_kyoudou);
	return TRUE;
}

/* \203\136\203\103\203\147\203\213 */
VOID	GaikouKyoudouWindow::SetTitle(VOID)
{
	UserCommandWindow::SetTextImage(&m_TextCtrl[0], "\213\244\223\257");	/* \203\173\203\136\203\223\202\314\203\166\203\214\201\133\203\147 */
	m_TextCtrl[1].SetPlate(TEXT_PLATE32, FALSE);
	if ( UINT_MAX == m_unCtrlID ) {
		SelectCommand(ID_KYOUDOU_TOSHI);
		m_unCtrlID = ID_KYOUDOU_TOSHI;
	}
	ReviseFocus();						/* \203\164\203\110\201\133\203\112\203\130\217\103\220\263 */
	EnableOkButton(ID_KYOUDOU_OK);			/* \202\156\202\152\203\173\203\136\203\223 */
	EnableJoukenButton(ID_KYOUDOU_JOUKEN);	/* \217\360\214\217\203\173\203\136\203\223 */
}

VOID	GaikouKyoudouWindow::SetKyoudou(VOID)
{
	if ( pkbNull == m_pkb ) {
		ASSERT(FALSE);
		return;
	}
	if ( pkkNull == m_pkkTgt ) {
		ASSERT(FALSE);
		return;
	}
	InitGaikouDataConfig();					/* \212\117\214\360\203\146\201\133\203\136\217\211\212\372\211\273 */
	SetGaikouData(&GaikouDataCfg);
}

/*****************************************************************************/

static
BOOL	ChkKyoudouKunshu(KList *klist, KPtr pkkTgt)
{
	INT		i, kazu;
	KPtr	pkk;

	if ( (kazu = klist->GetCount()) == 0 ) {
		return FALSE;
	}
	for ( i = 0 ; i < kazu ; i++ ) {
		pkk = klist->pkkGetKPtr(i);
		if ( pkk == pkkTgt ) {
			return TRUE;
		}
	}
	return FALSE;
}

static
BOOL	ChkKyoudouToshi(TList *tlist, TPtr pktTgt)
{
	INT		i, kazu;
	TPtr	pkt;

	if ( (kazu = tlist->GetCount()) == 0 ) {
		return FALSE;
	}
	for ( i = 0 ; i < kazu ; i++ ) {
		pkt = tlist->pktGetTPtr(i);
		if ( pkt == pktTgt ) {
			return TRUE;
		}
	}
	return FALSE;
}

/* pktTgt\202\311\213\244\223\257\215\354\220\355\202\252\202\305\202\253\202\351\214\116\216\345 */
static
INT		PickKyoudouKunshu(KList* klist, KPtr pkkSrc, TPtr pktTgt)
{
	KPtr	pkk, pkkTgt;
	INT	i;

	ASSERT(pktNull != pktTgt);
	klist->RemoveAll();
	pkkTgt = pktTgt->pkkShozoku();
	if ( pkkNull == pkkTgt ) {
		return 0;
	}
	if ( !pkkSrc->isSemekomiToshi(pktTgt) ) {
		ASSERT(FALSE);
		return 0;
	}
	for ( i = 0 ; i < KDATA_MAX ; i++ ) {
		pkk = KData::GetData(i);
		if ( NOTACTIVE(pkk) ) {
			continue;
		}
		if ( (pkk == pkkSrc) || (pkk == pkkTgt) ) {		/* \216\251\225\252 \221\316\217\333\202\306\223\257\202\266\214\116\216\345 */
			continue;
		}
		if ( !(pkk->iDoumei(pkkSrc) || pkk->isJuuzoku(pkkSrc)) ) {
			continue;
		}
		if ( !pkk->isSemekomiToshi(pktTgt) ) {
			continue;
		}
		klist->AddTail(pkk);
	}
	return klist->GetCount();
}

/* pkkTgt\202\306\213\244\223\257\215\354\220\355\202\252\202\305\202\253\202\351\223\163\216\163 */
static
INT		_PickKyoudouToshi(TList* tlist, KPtr pkkSrc, KPtr pkkTgt)
{
	KPtr	pkk;
	TPtr	pkt;
	INT		i;

	ASSERT(pkkNull != pkkTgt);
	tlist->RemoveAll();
	for ( i = 0 ; i < TDATA_MAX ; i++ ) {
		pkt = TData::GetData(i);
		if ( NOTACTIVE(pkt) ) {
			continue;
		}
		pkk = pkt->pkkShozoku();
		if ( pkkNull == pkk ) {		/* \213\363\224\222 */
			continue;
		}
		if ( (pkk == pkkSrc) || (pkk == pkkTgt) ) {		/* \216\251\225\252 \221\316\217\333\202\306\223\257\202\266\214\116\216\345 */
			continue;
		}
		if ( !pkkSrc->isSemekomiToshi(pkt) || !pkkTgt->isSemekomiToshi(pkt) ) {
			continue;
		}
		tlist->AddTail(pkt);
	}
	return tlist->GetCount();
}

static	K_PARAM	kyoudou_k_param[] = {
	KP_NAME,
	KP_TOTALHEISHI,
	KP_TEKITAI,
	KP_JUUZOKUKUNSHU,
	KP_RANK,
	KP_NONE
};

/* \214\360\217\302\214\116\216\345\221\111\221\360 */
VOID	GaikouKyoudouWindow::SelectKunshu(VOID)
{
	KPtr	pkk, pkkOld;
	KList	klist;
	TList	tlist;

	pkkOld = m_pkkTgt;
	if ( NOTACTIVE(m_pktTgt) ) {	/* \202\334\202\276\215\125\202\337\215\236\202\335\223\163\216\163\202\360\214\210\202\337\202\304\202\310\202\242 */
		klist = m_KList;
		pkk = SelectKunshuSingle(klist, kyoudou_k_param, strNull);
		if ( pkkNull == pkk ) {
			return;
		}
		m_pkkTgt = pkk;
	}
	else {
		if ( 0 == PickKyoudouKunshu(&klist, m_pkk, m_pktTgt) ) {
			ASSERT(FALSE);
			return;
		}
		pkk = SelectKunshuSingle(klist, kyoudou_k_param, strNull);
		if ( pkkNull == pkk ) {
			return;
		}
		ASSERT(pkk->isSemekomiToshi(m_pktTgt));
		if ( 0 == _PickKyoudouToshi(&tlist, m_pkk, pkk) ) {
			ASSERT(FALSE);
			return;
		}
		if ( !ChkKyoudouToshi(&tlist, m_pktTgt) ) {	/* \213\244\223\257\211\302\224\134\202\305\202\310\202\242 */
			m_pktTgt = pktNull;
		}
		m_pkkTgt = pkk;
	}
	if ( pkkOld != m_pkkTgt ) {
		InitRank();							/* \212\257\210\312\217\211\212\372\211\273 */
	}
//	DspData();
}

/* \214\116\216\345\221\111\221\360 */
void	GaikouKyoudouWindow::OnKunshu(GaikouKyoudouWindow* pThis)
{
	pThis->m_unCtrlID = ID_KYOUDOU_KUNSHU;
	pThis->EndModalLoop(ID_KYOUDOU_KUNSHU);
}

/* \217\157\220\167\202\306\223\257\202\266\202\305\202\267 */
//		\223\163\216\163\226\274\201\101\217\212\221\256\201\101\221\276\216\347\201\101\225\220\217\253\220\224\201\101\223\163\216\163\202\314\221\215\225\272\216\155\220\224
static	T_PARAM		_kyoudou_t_param[] ={
	TP_NAME,
	TP_SHOZOKU,
	TP_TAISHU,
	TP_BUSHOUSUU,
	TP_TOTALHEISHI,
	TP_NONE
};

/* \223\163\216\163\221\111\221\360 */
VOID	GaikouKyoudouWindow::SelectToshi(VOID)
{
	TPtr	pkt, pktOld;
	TList	tlist;
	KList	klist;

	pktOld = m_pktTgt;
	if ( NOTACTIVE(m_pkkTgt) ) {
		pkt = SelectToshiSingle(m_TList, _kyoudou_t_param, strNull);
		if ( pktNull == pkt ) {
			return;
		}
		m_pktTgt = pkt;
	}
	else {
		if ( 0 == _PickKyoudouToshi(&tlist, m_pkk, m_pkkTgt) ) {
			ASSERT(FALSE);
			return;
		}
		pkt = SelectToshiSingle(tlist, _kyoudou_t_param, strNull);
		if ( pktNull == pkt ) {
			return;
		}
		if ( 0 == PickKyoudouKunshu(&klist, m_pkk, pkt) ) {
			ASSERT(FALSE);
			return;
		}
		if ( !ChkKyoudouKunshu(&klist, m_pkkTgt) ) {	/* \213\244\223\257\211\302\224\134\202\305\202\310\202\242 */
			m_pkkTgt = pkkNull;
		}
		m_pktTgt = pkt;
	}
//	DspButton();
//	DspData();
}

/* \223\163\216\163\221\111\221\360 */
void	GaikouKyoudouWindow::OnToshi(GaikouKyoudouWindow* pThis)
{
	pThis->m_unCtrlID = ID_KYOUDOU_TOSHI;
	pThis->EndModalLoop(ID_KYOUDOU_TOSHI);
}

void	GaikouKyoudouWindow::OnBushou(GaikouKyoudouWindow* pThis)
{
	pThis->m_unCtrlID = ID_KYOUDOU_BUSHOU;
	pThis->EndModalLoop(ID_KYOUDOU_BUSHOU);
}

void	GaikouKyoudouWindow::OnJouken(GaikouKyoudouWindow* pThis)
{
	pThis->m_unCtrlID = ID_KYOUDOU_JOUKEN;
	pThis->EndModalLoop(ID_KYOUDOU_JOUKEN);
}

/* \202\156\202\152\203\173\203\136\203\223\202\252\211\237\202\271\202\351\202\251 */
BOOL	GaikouKyoudouWindow::ChkOkButton(VOID)
{
	KPtr	pkkSemekomi;

	if ( pkkNull == m_pkkTgt ) {
		return FALSE;
	}
	if ( pkbNull == m_pkb ) {
		return FALSE;
	}
	if ( pktNull == m_pktTgt ) {
		ASSERT(FALSE);
		return FALSE;
	}
	if ( (pkkSemekomi = m_pktTgt->pkkShozoku()) == pkkNull ) {
		ASS